#include "Buffer.h"
#include <errno.h>
#include <sys/uio.h>
#include <unistd.h>
/**
 * 从fd上读取数据 Poller工作在LT模式
 * Buffer 缓冲区是由数据的，但从fd上读数据的时候，却不知道tcp数据最终的大小
 *  */ 
ssize_t Buffer::readFd(int fd,int *savedErrno)
{
    char extrabuf[65536];
    struct iovec vec[2];
    const size_t writable = writeableBytes();
    vec[0].iov_base = begin() + writerIndex_;
    vec[0].iov_len = writable;
    vec[1].iov_base = extrabuf;
    vec[1].iov_len = sizeof extrabuf;
    //一次最多读64k数据
    const int iovcnt = (writable < sizeof extrabuf) ? 2 : 1;
    const ssize_t n = ::readv(fd,vec,iovcnt);//从fd中读出数据写入多个缓冲区
    if( n < 0)
    {
        *savedErrno = errno;
    }
    else if(n <= writable) // Buffer 的可写缓冲区已经够存储
    {
        writerIndex_ += n;
    }
    else// extrabuf里面也写入了数据
    {
        writerIndex_ = buffer_.size();
        append(extrabuf,n - writable);
    }
    return n;


}

ssize_t Buffer::writeFd(int fd,int *savedErrno)
{
    ssize_t n = ::write(fd, peek(), readableBytes());
    if(n < 0)
    {
        *savedErrno = errno;
    }
    return n;
}
